<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #main {
            width: 200px;
            height: 200px;
        }

        #ee {
            width: 20px;
            height: 20px;
            background-color: skyblue;
        }
    </style>
</head>


<body>
    <div id="main"></div>
    <div id="ee"></div>
    <script>
        // var obj = document.querySelector('#main');
        // obj.style.border = '2px solid red';
        // // 初始化一个回调函数
        // setTimeout(function () {
        //     // 它将隐藏对象
        //     obj.style.display = 'none';
        // }, 1000);
        // // 一个用于延时显示警告信息的通用函数
        // function delay(msg, time) {
        //     // 初始化一个封装的回调函数
        //     setTimeout(function () {
        //         // 它将包含本函数的外围函数传入msg变量
        //         console.log(msg);
        //     }, time);
        // }
        // // 用两个参数调用delay
        // delay('welcome', 2000);



        console.log('----------');

        // 用闭包实现函数curry化
        // function addGenerator(num) {
        //     // 返回一个简单的函数，求两个数字的和，其中第一个数字来自生成器
        //     return function (toAdd) {
        //         return num + toAdd;
        //     }
        // }
        // var sum = addGenerator(5);
        // console.log(sum(4) == 9) //true


        // 实现隐藏作用域
        // (function () {
        //     // 变量本来应该是全局的
        //     var msg = 'thanks for visiting';

        //     // 将一个函数绑定到全局对象
        //     window.onunload = function () {
        //         // 这个函数使用了隐藏的msg
        //         alert(msg);
        //     }
        //     // 关闭匿名函数并执行
        // })()
        // 出问题了

        // 使用匿名函数来激发出创建多个使用闭包函数所需的作用域
        // var ee = document.querySelector('#ee');
        // // 用于绑定一个数组
        // var items = ['click', 'keypress'];

        // // 遍历数组的每个成员
        // for (var i = 0; i < items.length; i++) {
        //     // 使用一个自执行的匿名函数来激发出作用域
        //     (function () {
        //         // 记住在这个作用域内的值
        //         var item = items[i];
        //         // 将一个函数绑定到该元素
        //         ee['on' + item] = function () {
        //             // item引用for循环上下文所属作用域中的一个父变量
        //             alert('Thanks for you' + item);
        //         }
        //     })();
        // }


        // 闭包可以从外部读取到函数内部变量
        // function f1() {
        //     var n = 999;
        //     function f2() {
        //         alert(n);
        //     }
        //     return f2;
        // }
        // var result = f1();
        // result();

        // 让这些变量的值始终保持在内存中，不会在f1调用后被自动清除
        // function f1() {
        //     var n = 999;
        //     nAdd = function () { n += 1 }

        //     function f2() {
        //         alert(n);
        //     }
        //     return f2;
        // }

        // var result = f1();
        // result(); // 999
        // nAdd();
        // result(); // 1000



        // 练习题
        var name = "The Window";
        var object = {
            name: "My Object",
            getNameFunc: function () {
                return function () {
                    return this.name; // this指向window
                };
            }
        };

        alert(object.getNameFunc()());


        var name = "The Window";

        var object = {
            name: "My Object",
            getNameFunc: function () {
                var that = this;
                return function () {
                    return that.name;
                };
            }
        };

        alert(object.getNameFunc()());

    </script>
</body>

</html>